home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / files.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-31  |  30.1 KB  |  878 lines

  1. /* System-dependent definitions of various files, spool directories, etc */
  2. /* Mods by PA0GRI */
  3. #include <stdio.h>
  4. #include "global.h"
  5. #include "config.h"
  6. #include "netuser.h"
  7. #include "files.h"
  8. #include "md5.h"
  9.  
  10. #if defined(MSDOS) || defined(TNOS_68K)
  11. #ifdef MSDOS
  12. char System[] = "MSDOS";
  13. #else
  14. char System[] = "OSK";
  15. #endif
  16. char *Startup    = "/autoexec.nos";        /* Initialization file */
  17. char *Userfile    = "/ftpusers";            /* Authorized FTP users and passwords */
  18. char *Hostfile    = "/net.rc";            /* hosts and passwords */
  19. char *Maillog    = "/spool/mail.log";        /* mail log */
  20. char *Mailspool    = "/spool/mail";        /* Incoming mail */
  21. char *Mailqdir    = "/spool/mqueue";        /* Outgoing mail spool */
  22. char *Mailqueue    = "/spool/mqueue/*.wrk";    /* Outgoing mail work files */
  23. char *Routeqdir    = "/spool/rqueue";        /* queue for router */
  24. char *Alias    = "/alias";            /* the alias file */
  25. char *Group    = "/groups";            /* the group file */
  26. char *Dfile    = "/domain.txt";        /* Domain cache */
  27. char *Fdir    = "/finger";            /* Finger info directory */
  28. char *Fdbase    = "/finger/dbase.dat";        /* Finger database */
  29. char *Quotes    = "/spool/quotes";        /* List of quotes of the day */
  30. #ifdef TUTOR
  31. char *Tutor     = "/spool/tutor";        /* Tutorial Server directory */
  32. char *Info      = "/spool/info";        /* Information Center directory */
  33. char *News      = "/spool/news";        /* News Center directory */
  34. #endif
  35. char *Spool    = "/spool";            /* Spool directory */
  36. char *Arealist    = "/spool/areas";        /* List of message areas */
  37. char *AreaSlist    = "/spool/areas.sys";        /* List of message areas for sysops */
  38. char *Rewritefile = "/spool/rewrite";       /* Address rewrite file */
  39. #ifdef MAILBOX
  40. char *Signature = "/spool/signatur";        /* Mail signature file directory */
  41. char *Historyfile = "/spool/history";       /* Message ID history file */
  42. char *Helpdir   = "/spool/help";        /* Mailbox help file directory */
  43. #ifdef USERLOG
  44. char *UDefaults = "/spool/users.dat";       /* User preference file */
  45. char *UDefbak = "/spool/users.bak";
  46. #endif
  47. #endif /* MAILBOX */
  48. #if (defined(POP) || defined(POP2CLIENT) || defined(POP2SERVER) || defined(POP3CLIENT) || defined(POP3SERVER))
  49. char *Popusers  = "/popusers";          /* POP user and password file */
  50. #endif
  51. #if (defined(NNTP) || defined(NNTPS))
  52. char *Newsdir   = "/spool/nnews";        /* News messages and NNTP data */
  53. #endif
  54. #ifdef MBFWD
  55. char *Forwardfile = "/spool/forward.bbs";   /* Mail forwarding file */
  56. #endif
  57. #ifdef NETROM
  58. char *Netromfile = "/netrom.sav";       /* Netrom node save file */
  59. #endif
  60. char *Onexit = "/onexit.nos";           /* Commands to be executed on exiting */
  61. #ifdef EXPIRY
  62. char *Expirefile = "/spool/expire.dat"; /* Message expiration control file */
  63. #endif
  64. char *FTPHelp = "/spool/help/ftp.hlp";        /* FTP Help file */
  65. char *Ftpmotd = "/spool/ftpmotd";        /* FTP message of the day */
  66. char *EditorHelp = "/spool/help/editor.hlp";    /* Mini-Editor Help file */
  67. char *MOTDfile = "/spool/motd";            /* Mailbox MOTD file */
  68. char *MOTDsysfile = "/spool/motd.sys";        /* Mailbox MOTD file for SYSOPs */
  69. char *NEWUSERfile = "/spool/newuser";        /* New Mbox User file */
  70. char *WhitePagesBBS = "/spool/wpagebbs";    /* White Pages bbs log file */
  71. char *WhitePages = "/spool/wpages";        /* White Pages user log file */
  72. #ifdef  CONVERS
  73. char *ConfInfo    = "/spool/confinfo";        /* Conferenge bridge user info */
  74. char *ConfHlp = "/spool/help/confmode.hlp";
  75. char *NetControlHlp = "/spool/help/netcntrl.hlp";
  76. #endif
  77. #ifdef    NNTPS
  78. char *Active    = "/spool/nnews/active";        /* */
  79. char *Pointer    = "/spool/nnews/pointer";    /* */
  80. char *NInfo    = "/spool/nnews/info";        /* */
  81. char *Nhelp    = "/spool/nnews/help";        /* */
  82. char *History    = "/spool/nnews/history";    /* */
  83. char *Forward    = "/spool/nnews/forward";    /* */
  84. char *Poll    = "/spool/nnews/poll";        /* */
  85. #endif
  86. char *MBOXHelp    = "/spool/help/mbox.hlp";    /* MBOX Help file */
  87. char *CommandHelp = "/spool/help/command.hlp";    /* Command Session Help file */
  88. char *VersionFile = "/spool/help/version.hlp";  /* Command Session version file */
  89. #ifndef TNOS_68K
  90. char Eol[]    = "\r\n";
  91. #else
  92. char Eol[]    = "\n";
  93. #endif
  94. #ifdef GPS
  95. char *GPSfile = "/GPSfile";    /* All heard GPS position data */
  96. #endif
  97. char *ANSIArea = "/spool/menus/areas.bbs";    /* ANSI areas file */
  98. char *ANSILogin = "/spool/menus/login.bbs";    /* ANSI login file */
  99. char *SMILEYFile = "/spool/help/smileys.txt";    /* conf smiley file */
  100. char *ConfNews = "/spool/help/confnews.txt";    /* conference bridge news file */
  101. #define    SEPARATOR    "/"
  102. #endif
  103.  
  104. #ifdef    UNIX
  105. char System[] = "UNIX";
  106. char *Startup    = "./startup.nos";        /* Initialization file */
  107. char *Config    = "./config.nos";        /* Device configuration list */
  108. char *Hostfile    = "./net.rc";            /* hosts and passwords */
  109. char *Userfile    = "./ftpusers";
  110. char *Mailspool    = "./mail";
  111. char *Maillog    = "./mail.log";            /* mail log */
  112. char *Mailqdir    = "./mqueue";
  113. char *Mailqueue    = "./mqueue/*.wrk";
  114. char *Routeqdir    = "./rqueue";            /* queue for router */
  115. char *Alias    = "./alias";            /* the alias file */
  116. char *Group    = "./group";            /* the group file */
  117. char *Dfile    = "./domain.txt";        /* Domain cache */
  118. char *Fdir    = "./finger";            /* Finger info directory */
  119. char *Fdbase     = "./finger/dbase.dat";        /* Finger database */
  120. char *Quotes    = "./quotes";            /* List of quotes of the day */
  121. #ifdef TUTOR
  122. char *Tutor     = "./tutor";            /* Tutorial Server directory */
  123. char *Info      = "./info";            /* Information Center directory */
  124. char *News      = "./news";            /* News Center directory */
  125. #endif
  126. char *Spool    = "./spool";            /* Spool directory */
  127. char *Arealist    = "./areas";            /* List of message areas */
  128. char *AreaSlist    = "./areas.sys";        /* List of message areas for sysops */
  129. char *Helpdir    = "./help";            /* Mailbox help file directory */
  130. char *Rewritefile = "./rewrite";        /* Address rewrite file */
  131. char *Signature    = "./signatur";            /* Mail signature file directory */
  132. char *Popusers    = "./popusers";            /* POP user and password file */
  133. char *Newsdir    = "./nnews";            /* News messages and NNTP data */
  134. char *Forwardfile = "./forward.bbs";        /* Mail forwarding file */
  135. char *Historyfile = "./history";        /* Message ID history file */
  136. char *Netromfile = "./netrom.sav";        /* Netrom node save file */
  137. char *UDefaults = "/spool/users.dat";       /* User preference file */
  138. char *Onexit = "./onexit.nos";           /* Commands to be executed on exiting */
  139. char *Expirefile = "./expire.dat"; /* Message expiration control file */
  140. char *EditorHelp = "./help/editor.hlp";        /* Mini-Editor Help file */
  141. char *FTPHelp = "./help/ftp.hlp";        /* FTP Help file */
  142. char *MOTDfile = "./motd";            /* Mailbox MOTD file */
  143. char *MOTDsysfile = "./motd.sys";        /* Mailbox MOTD file for SYSOPs */
  144. char *NEWUSERfile = "./newuser";        /* New Mbox User file */
  145. char *WhitePagesBBS = "./wpagebbs";        /* White Pages BBS log file */
  146. char *WhitePages = "./wpages";            /* White Pages user log file */
  147. #ifdef  CONVERS
  148. char *ConfInfo    = "./spool/confinfo";        /* Conferenge bridge config */
  149. char *ConfHlp = "./help/confmode.hlp";
  150. char *NetControlHlp = "./help/netcntrl.hlp";
  151. #endif
  152. #ifdef    NNTPS
  153. char *Active    = "./spool/nnews/active";        /* */
  154. char *Pointer    = "./spool/nnews/pointer";    /* */
  155. char *NInfo    = "./spool/nnews/info";        /* */
  156. char *Nhelp    = "./spool/nnews/help";        /* */
  157. char *History    = "./spool/nnews/history";    /* */
  158. char *Forward    = "./spool/nnews/forward";    /* */
  159. char *Poll    = "./spool/nnews/poll";        /* */
  160. #endif
  161. char *MBOXHelp    = "./spool/help/mbox.hlp";    /* MBOX Help file */
  162. char *CommandHelp = "./spool/help/command.hlp";    /* Command Session Help file */
  163. char *VersionFile = "./spool/help/version.hlp";  /* Command Session version file */
  164. char Eol[]    = "\n";
  165. #define    SEPARATOR    "/"
  166. #endif
  167.  
  168. #ifdef    AMIGA
  169. char System[] = "AMIGA";
  170. char *Startup    = "TCPIP:nos-startup";
  171. char *Config    = "TCPIP:config.nos";        /* Device configuration list */
  172. char *Hostfile    = "TCPIP:net.rc";        /* hosts and passwords */
  173. char *Userfile    = "TCPIP:ftpusers";
  174. char *Mailspool    = "TCPIP:spool/mail";
  175. char *Maillog    = "TCPIP:spool/mail.log";
  176. char *Mailqdir    = "TCPIP:spool/mqueue";
  177. char *Mailqueue    = "TCPIP:spool/mqueue/#?.wrk";
  178. char *Routeqdir    = "TCPIP:spool/rqueue";        /* queue for router */
  179. char *Alias    = "TCPIP:alias";        /* the alias file */
  180. char *Group    = "TCPIP:group";        /* the group file */
  181. char *Dfile    = "TCPIP:domain.txt";        /* Domain cache */
  182. char *Fdir    = "TCPIP:finger";        /* Finger info directory */
  183. char *Fdbase     = "TCPIP:finger/dbase.dat";    /* Finger database */
  184. char *Quotes    = "TCPIP:spool/quotes";        /* List of quotes of the day */
  185. #ifdef TUTOR
  186. char *Tutor     = "TCPIP:spool/tutor";        /* Tutorial Server directory */
  187. char *Info      = "TCPIP:spool/info";        /* Information Center directory */
  188. char *News      = "TCPIP:spool/news";        /* News Center directory */
  189. #endif
  190. char *Spool    = "TCPIP:spool";        /* Spool directory */
  191. char *Arealist    = "TCPIP:spool/areas";        /* List of message areas */
  192. char *AreaSlist    = "TCPIP:spool/areas.sys";    /* List of message areas for sysops */
  193. char *Helpdir    = "TCPIP:spool/help";        /* Mailbox help file directory */
  194. char *Rewritefile = "TCPIP:spool/rewrite";    /* Address rewrite file */
  195. char *Signature    = "TCPIP:spool/signatur";    /* Mail signature file directory */
  196. char *Popusers    = "TCPIP:/popusers";        /* POP user and password file */
  197. char *Newsdir    = "TCPIP:spool/nnews";        /* News messages and NNTP data */
  198. char *Forwardfile = "TCPIP:spool/forward.bbs";    /* Mail forwarding file */
  199. char *Historyfile = "TCPIP:spool/history";    /* Message ID history file */
  200. char *UDefaults = "TCPIP:spool/users.dat";  /* User preference file */
  201. char *Netromfile = "TCPIP:netrom.sav";      /* Netrom node save file */
  202. char *Onexit = "TCPIP:onexit.nos";           /* Commands to be executed on exiting */
  203. char *Expirefile = "TCPIP:spool/expire.dat"; /* Message expiration control file */
  204. char *EditorHelp = "TCPIP:spool/help/editor.hlp";    /* Mini-Editor Help file */
  205. char *FTPHelp = "TCPIP:spool/help/ftp.hlp";    /* FTP Help file */
  206. char *MOTDfile = "TCPIP:spool/motd";        /* Mailbox MOTD file */
  207. char *MOTDsysfile = "TCPIP:spool/motd.sys";    /* Mailbox MOTD file for SYSOPs */
  208. char *NEWUSERfile = "TCPIP:spool/newuser";    /* New Mbox User file */
  209. char *WhitePagesBBS = "TCPIP:spool/wpagebbs";    /* White Pages BBS log file */
  210. char *WhitePages = "TCPIP:spool/wpages";    /* White Pages user log file */
  211. #ifdef  CONVERS
  212. char *ConfInfo    = "TCPIP:spool/confinfo";    /* Conferenge bridge config */
  213. char *ConfHlp = "TCPIP:spool/help/confmode.hlp";
  214. char *NetControlHlp = "TCPIP:spool/help/netcntrl.hlp";
  215. #endif
  216. #ifdef    NNTPS
  217. char *Active    = "TCPIP:spool/nnews/active";     /* */
  218. char *Pointer   = "TCPIP:spool/nnews/pointer";    /* */
  219. char *NInfo = "TCPIP:spool/nnews/info";       /* */
  220. char *Nhelp = "TCPIP:spool/nnews/help";       /* */
  221. char *History   = "TCPIP:spool/nnews/history";    /* */
  222. char *Forward   = "TCPIP:spool/nnews/forward";    /* */
  223. char *Poll  = "TCPIP:spool/nnews/poll";       /* */
  224. #endif
  225. char *MBOXHelp    = "TCPIP:spool/help/mbox.hlp";    /* MBOX Help file */
  226. char *CommandHelp = "TCPIP:spool/help/command.hlp";    /* Command Session Help file */
  227. char *VersionFile = "TCPIP:spool/help/version.hlp";  /* Command Session version file */
  228. char Eol[]    = "\r\n";
  229. #define    SEPARATOR    "/"
  230. #endif
  231.  
  232. #ifdef    MAC
  233. char System[] = "MACOS";
  234. char *Startup    = "Mikes Hard Disk:nos.start";
  235. char *Config    = "Mikes Hard Disk:config.nos";    /* Device configuration list */
  236. char *Hostfile    = "Mikes Hard Disk:net.rc";    /* hosts and passwords */
  237. char *Userfile    = "Mikes Hard Disk:ftpusers";
  238. char *Mailspool    = "Mikes Hard Disk:spool:mail:";
  239. char *Maillog    = "Mikes Hard Disk:spool:mail.log:";
  240. char *Mailqdir    = "Mikes Hard Disk:spool:mqueue:";
  241. char *Mailqueue    = "Mikes Hard Disk:spool:mqueue:*.wrk";
  242. char *Routeqdir    = "Mikes Hard Disk:spool/rqueue:";    /* queue for router */
  243. char *Alias    = "Mikes Hard Disk:alias";        /* the alias file */
  244. char *Group    = "Mikes Hard Disk:group";        /* the group file */
  245. char *Dfile    = "Mikes Hard Disk:domain:txt";        /* Domain cache */
  246. char *Fdir    = "Mikes Hard Disk:finger";        /* Finger info directory */
  247. char *Fdbase     = "Mikes Hard Disk:finger/dbase.dat";    /* Finger database */
  248. char *Quotes    = "Mikes Hard Disk:spool/quotes";    /* List of quotes of the day */
  249. #ifdef TUTOR
  250. char *Tutor     = "Mikes Hard Disk:spool/tutor";    /* Tutorial Server directory */
  251. char *Info      = "Mikes Hard Disk:spool/info";        /* Information Center directory */
  252. char *News      = "Mikes Hard Disk:spool/news";        /* News Center directory */
  253. #endif
  254. char *Spool    = "Mikes Hard Disk:spool";        /* Spool directory */
  255. char *Arealist    = "Mikes Hard Disk:spool/areas";    /* List of message areas */
  256. char *AreaSlist    = "Mikes Hard Disk:spool/areas.sys";    /* List of message areas for sysops */
  257. char *Helpdir    = "Mikes Hard Disk:spool/help";        /* Mailbox help file directory */
  258. char *Rewritefile = "Mikes Hard Disk:spool/rewrite";    /* Address rewrite file */
  259. char *Signature    = "Mikes Hard Disk:spool/signatur";    /* Mail signature file directory */
  260. char *Popusers    = "Mikes Hard Disk:/popusers";        /* POP user and password file */
  261. char *Newsdir    = "Mikes Hard Disk:spool/nnews";    /* News messages and NNTP data */
  262. char *Forwardfile = "Mikes Hard Disk:spool/forward.bbs"; /* Mail forwarding file */
  263. char *Historyfile = "Mikes Hard Disk:spool/history";    /* Message ID history file */
  264. char *UDefaults = "Mikes Hard Disk:spool/users.dat";  /* User preference file */
  265. char *Netromfile = "Mikes Hard Disk:netrom.sav";    /* Netrom node save file */
  266. char *Onexit = "Mikes Hard Disk:onexit.nos";           /* Commands to be executed on exiting */
  267. char *Expirefile = "Mikes Hard Disk:spool/expire.dat"; /* Message expiration control file */
  268. char *EditorHelp = "Mikes Hard Disk:spool/help/editor.hlp";    /* Mini-Editor Help file */
  269. char *FTPHelp = "Mikes Hard Disk:spool/help/ftp.hlp";    /* FTP Help file */
  270. char *MOTDfile = "Mikes Hard Disk:spool/motd";        /* Mailbox MOTD file */
  271. char *MOTDsysfile = "Mikes Hard Disk:spool/motd.sys";    /* Mailbox MOTD file for SYSOPs */
  272. char *NEWUSERfile = "Mikes Hard Disk:spool/newuser";    /* New Mbox User file */
  273. char *WhitePagesBBS = "Mikes Hard Disk:spool/wpagebbs";    /* White Pages BBS log file */
  274. char *WhitePages = "Mikes Hard Disk:spool/wpages";    /* White Pages user log file */
  275. #ifdef  CONVERS
  276. char *ConfInfo = "Mikes Hard Disk:spool/confinfo";        /* Conferenge bridge config */
  277. char *ConfHlp = "Mikes Hard Disk:spool/help/confmode.hlp";
  278. char *NetControlHlp = "Mikes Hard Disk:spool/help/netcntrl.hlp";
  279. #endif
  280. #ifdef    NNTPS
  281. char *Active    = "Mikes Hard Disk:spool/nnews/active";        /* */
  282. char *Pointer    = "Mikes Hard Disk:spool/nnews/pointer";    /* */
  283. char *NInfo    = "Mikes Hard Disk:spool/nnews/info";        /* */
  284. char *Nhelp    = "Mikes Hard Disk:spool/nnews/help";        /* */
  285. char *History    = "Mikes Hard Disk:spool/nnews/history";    /* */
  286. char *Forward    = "Mikes Hard Disk:spool/nnews/forward";    /* */
  287. char *Poll    = "Mikes Hard Disk:spool/nnews/poll";        /* */
  288. #endif
  289. char *MBOXHelp    = "Mikes Hard Disk:spool/help/mbox.hlp";    /* MBOX Help file */
  290. char *CommandHelp = "Mikes Hard Disk:spool/help/command.hlp";    /* Command Session Help file */
  291. char *VersionFile = "Mikes Hard Disk:spool/help/version.hlp";  /* Command Session version file */
  292. char Eol[]    = "\r";
  293. #define    SEPARATOR    ":"
  294. #endif
  295.  
  296. static char *rootdir = "";
  297. static int Assigned;
  298. int Initroot;
  299. extern char *firstMsg;
  300. extern char Whitespace[];
  301.  
  302. /* Establish a root directory other than the default. Can only be called
  303.  * once, at startup time
  304.  */
  305. void
  306. initroot(root)
  307. char *root;
  308. {
  309.     if(Assigned) {
  310.         firstMsg = strdup ("\a-f option used, -d ignored !\n");
  311.         return;
  312.     }
  313. #ifdef  MSDOS
  314.     undosify(root);
  315. #endif
  316.     rootdir = strdup( root );
  317.  
  318.     Startup = rootdircat(Startup);
  319.     Userfile = rootdircat(Userfile);
  320.     Hostfile = rootdircat(Hostfile);
  321.     Maillog = rootdircat(Maillog);
  322.     Mailspool = rootdircat(Mailspool);
  323.     Mailqdir = rootdircat(Mailqdir);
  324.     Mailqueue = rootdircat(Mailqueue);
  325.     Routeqdir = rootdircat(Routeqdir);
  326.     Alias = rootdircat(Alias);
  327.     Group = rootdircat(Group);
  328.     Dfile = rootdircat(Dfile);
  329.     Fdir = rootdircat(Fdir);
  330.     Fdbase = rootdircat(Fdbase);
  331.     Quotes = rootdircat(Quotes);
  332. #ifdef TUTOR
  333.     Tutor = rootdircat(Tutor);
  334.     Info = rootdircat(Info);
  335.     News = rootdircat(News);
  336. #endif
  337.     Spool = rootdircat(Spool);
  338.     Arealist = rootdircat(Arealist);
  339.     AreaSlist = rootdircat(AreaSlist);
  340.     Rewritefile = rootdircat(Rewritefile);
  341. #ifdef MAILBOX
  342.     Signature = rootdircat(Signature);
  343.     Historyfile = rootdircat(Historyfile);
  344.     Helpdir = rootdircat(Helpdir);
  345. #ifdef USERLOG
  346.     UDefaults = rootdircat(UDefaults);
  347.     UDefbak = rootdircat(UDefbak);
  348. #endif
  349. #endif
  350. #if (defined(POP) || defined(POP2CLIENT) || defined(POP2SERVER) || defined(POP3CLIENT) || defined(POP3SERVER))
  351.     Popusers = rootdircat(Popusers);
  352. #endif
  353. #if (defined(NNTP) || defined(NNTPS))
  354.     Newsdir = rootdircat(Newsdir);
  355. #endif
  356. #ifdef MBFWD
  357.     Forwardfile = rootdircat(Forwardfile);
  358. #endif
  359. #ifdef NETROM
  360.     Netromfile = rootdircat(Netromfile);
  361. #endif
  362.     Onexit = rootdircat(Onexit);
  363. #ifdef EXPIRY
  364.     Expirefile = rootdircat(Expirefile);
  365. #endif
  366.     FTPHelp = rootdircat(FTPHelp);
  367.     Ftpmotd = rootdircat(Ftpmotd);
  368.     EditorHelp = rootdircat(EditorHelp);
  369.     MOTDfile = rootdircat(MOTDfile);
  370.     MOTDsysfile = rootdircat(MOTDsysfile);
  371.     NEWUSERfile = rootdircat(NEWUSERfile);
  372.     WhitePagesBBS = rootdircat(WhitePagesBBS);
  373.     WhitePages = rootdircat(WhitePages);
  374. #ifdef  CONVERS
  375.     ConfInfo=rootdircat(ConfInfo);
  376.     ConfHlp=rootdircat(ConfHlp);
  377.     NetControlHlp=rootdircat(NetControlHlp);
  378. #endif
  379. #ifdef    NNTPS
  380.     Active = rootdircat(Active);
  381.     Pointer = rootdircat(Pointer);
  382.     NInfo = rootdircat(NInfo);
  383.     Nhelp = rootdircat(Nhelp);
  384.     History = rootdircat(History);
  385.     Forward = rootdircat(Forward);
  386.     Poll = rootdircat(Poll);
  387. #endif
  388.     MBOXHelp = rootdircat(MBOXHelp);
  389.     CommandHelp = rootdircat(CommandHelp);
  390.     VersionFile = rootdircat(VersionFile);
  391. #ifdef GPS
  392.     GPSfile = rootdircat(GPSfile);
  393. #endif
  394.     ANSIArea = rootdircat(ANSIArea);
  395.     ANSILogin = rootdircat(ANSILogin);
  396.     SMILEYFile = rootdircat(SMILEYFile);
  397.     ConfNews = rootdircat(ConfNews);
  398.     Initroot = 1;
  399. }
  400.  
  401. /* Concatenate root, separator and arg strings into a malloc'ed output
  402.  * buffer, then remove repeated occurrences of the separator char
  403.  */
  404. char *
  405. rootdircat(filename)
  406. char *filename;
  407. {
  408.     char *out = filename;
  409.  
  410.     if(strlen(rootdir) > 0){
  411.         char *separator = SEPARATOR;
  412.         out = mallocw(strlen(rootdir)
  413.             + strlen(separator)
  414.             + strlen(filename) +1);
  415.         strcpy(out,rootdir);
  416.         strcat(out,separator);
  417.         strcat(out,filename);
  418.         if(*separator != '\0'){
  419.             char *p1, *p2;
  420.         /* Remove any repeated occurrences */
  421.             p1 = p2 = out;
  422.             while(*p2 != '\0'){
  423.                 *p1++ = *p2++;
  424.                 while(p2[0] == p2[-1] && p2[0] == *separator)
  425.                     p2++;
  426.             }
  427.             *p1 = '\0';
  428.         }
  429.     }
  430.     return out;
  431. }
  432.  
  433. /* Read through FTPUSERS looking for user record
  434.  * Returns line which matches username, or NULLCHAR when no match.
  435.  * Each of the other variables must be copied before freeing the line.
  436.  */
  437. char *
  438. userlookup(username,password,directory,permission,ip_address)
  439. char *username;
  440. char **password;
  441. char **directory;
  442. long   *permission;
  443. int32 *ip_address;
  444. {
  445.     FILE *fp;
  446.     char *buf;
  447.     char *cp;
  448.     char *universal = NULLCHAR;
  449.  
  450.     if((fp = fopen(Userfile,READ_TEXT)) == NULLFILE)
  451.         /* Userfile doesn't exist */
  452.         return NULLCHAR;
  453.  
  454.     buf = mallocw(128);
  455.     while ( fgets(buf,128,fp) != NULLCHAR ){
  456.         if(*buf == '#')
  457.             continue;    /* Comment */
  458.  
  459.         if((cp = strpbrk(buf," \t")) == NULLCHAR)
  460.             /* Bogus entry */
  461.             continue;
  462.         *cp++ = '\0';        /* Now points to password */
  463.  
  464.         if( stricmp(username,buf) == 0 )
  465.             break;        /* Found user */
  466.         if(stricmp("univperm",buf) == 0)
  467.             universal = strdup(cp);    /* remember their anon entry */
  468.     }
  469.     if((universal == NULLCHAR) && (feof(fp))){
  470.         /* username not found in file, nor was univperm */
  471.         fclose(fp);
  472.         free(buf);
  473.         return NULLCHAR;
  474.     }
  475.     if(feof(fp)){
  476.         /* restore anonymous to the buffer */
  477.         strcpy(cp = buf, universal);
  478.         free(universal);
  479.         universal = NULLCHAR;
  480.     }
  481.     if(universal != NULLCHAR)
  482.         free(universal);
  483.     fclose(fp);
  484.  
  485.     if ( password != NULL )
  486.         *password = cp;
  487.  
  488.     /* Look for space or tab after password field in file */
  489.     if((cp = strpbrk(cp," \t")) == NULLCHAR)    {
  490.         /* Invalid file entry */
  491.         free(buf);
  492.         return NULLCHAR;
  493.     }
  494.     *cp++ = '\0';    /* Now points to directory field */
  495.  
  496.     if ( directory != NULL )
  497.         *directory = cp;
  498.  
  499.     if((cp = strpbrk(cp," \t")) == NULLCHAR)    {
  500.         /* Permission field missing */
  501.         free(buf);
  502.         return NULLCHAR;
  503.     }
  504.     *cp++ = '\0';    /* now points to permission field */
  505.  
  506.     if ( permission != NULL )    {
  507.         if(!strnicmp(cp,"0x",2))
  508.             *permission = htol(cp);
  509.         else
  510.             *permission = atol(cp);
  511.     }
  512.  
  513.     if((cp = strpbrk(cp," \t")) == NULLCHAR)    {
  514.         /* IP address missing */
  515.         if ( ip_address != NULL )
  516.             *ip_address = 0L;
  517.     } else {
  518.         *cp++ = '\0';    /* now points at IP address field */
  519.         if ( ip_address != NULL )
  520.             *ip_address = resolve( cp );
  521.     }
  522.     return buf;
  523. }
  524.  
  525.  
  526. /* Subroutine for logging in the user whose name is name and password is pass.
  527.    The buffer path should be long enough to keep a line from the userfile.
  528.    If pwdignore is true, the password check will be overridden.
  529.    The return value is the permissions field or -1 if the login failed.
  530.    Path is set to point at the path field, and pwdignore will be true if no
  531.    particular password was needed for this user.
  532.  */
  533. long
  534. userlogin(name,pass,path,len,pwdignore)
  535. char *name;
  536. char *pass;
  537. char **path;
  538. int len;            /* Length of buffer pointed at by *path */
  539. int *pwdignore;
  540. {
  541.     char *buf;
  542.     char *password;
  543.     char *directory;
  544.     long permission;
  545.     int anonymous;
  546.     char *cp;
  547.     char hashpass[16];
  548.     MD5_CTX md;
  549.  
  550.     if ( (buf = userlookup( name, &password, &directory,
  551.             &permission, NULL )) == NULLCHAR ) {
  552.         return -1;
  553.     }
  554.  
  555.     anonymous = *pwdignore;
  556.     if(strcmp(password,"*") == 0)
  557.         anonymous = TRUE;    /* User ID is password-free */
  558.     if (!anonymous) {
  559.         if(readhex(hashpass,password,sizeof(hashpass)) != sizeof(hashpass)){
  560.             /* Invalid hashed password in file */
  561.             free(buf);
  562.             return -1;
  563.         }
  564.         MD5Init(&md);
  565.         MD5Update(&md,name,strlen(name));
  566.         MD5Update(&md,pass,strlen(pass));
  567.         MD5Final(&md);
  568.         if(memcmp(&md.digest,hashpass,sizeof(hashpass)) != 0){
  569.             /* Incorrect password given */
  570.             free(buf);
  571.             return -1;
  572.         }
  573.     }
  574.     if ( strlen( directory ) + 1 > len ) {
  575.         /* not enough room for path */
  576.         free(buf);
  577.         return -1;
  578.     }
  579.  
  580. #if   defined(AMIGA)
  581.     /*
  582.      * Well, on the Amiga, a file can be referenced by many names:
  583.      * device names (DF0:) or volume names (My_Disk:).  This hunk of code
  584.      * passed the pathname specified in the ftpusers file, and gets the
  585.      * absolute path copied into the user's buffer.  We really should just
  586.      * allocate the buffer and return a pointer to it, since the caller
  587.      * really doesn't have a good idea how long the path string is..
  588.      */
  589.     if ( (directory = pathname("", directory)) != NULLCHAR ) {
  590.         strcpy(*path, directory);
  591.         free(directory);
  592.     } else {
  593.         **path = '\0';
  594.     }
  595. #else
  596.     strcpy(*path,directory);
  597.     /* Convert any backslashes to forward slashes, for backward
  598.      * compatibility with the old NET
  599.      */
  600.     while((cp = strchr(*path,'\\')) != NULLCHAR)
  601.         *cp = '/';
  602. #endif
  603.     free(buf);
  604.     *pwdignore = anonymous;
  605.     /* Finally return the permission bits */
  606.     return permission;
  607. }
  608. /* MD5 hash plaintext passwords in user file */
  609. void
  610. usercvt()
  611. {
  612.     FILE *fp,*fptmp;
  613.     char *buf;
  614.     char hexbuf[16];
  615.     int needsit = 0;
  616.     int len,nlen,plen,i;
  617.     char *pass;
  618.     MD5_CTX md;
  619.  
  620.     if((fp = fopen(Userfile,READ_TEXT)) == NULLFILE)
  621.         return;        /* Userfile doesn't exist */
  622.  
  623.     buf = mallocw(BUFSIZ);
  624.     while(fgets(buf,BUFSIZ,fp) != NULLCHAR){
  625.         rip(buf);
  626.         len = strlen(buf);
  627.         if(len == 0 || *buf == '#')
  628.             continue;    /* Blank or comment line */
  629.  
  630.         if((nlen = strcspn(buf,Whitespace)) == len)
  631.             continue;    /* No end to the name! */
  632.  
  633.         /* Skip whitespace between name and pass */
  634.         for(pass=&buf[nlen];isspace(*pass);pass++)
  635.             ;
  636.         if(*pass != '\0' && *pass != '*'
  637.          && readhex(hexbuf,pass,sizeof(hexbuf)) != 16){
  638.             needsit = 1;
  639.             break;
  640.         }
  641.     }
  642.     if(!needsit){
  643.         /* Everything is in order */
  644.         fclose(fp);
  645.         free(buf);
  646.         return;
  647.     }
  648.     /* At least one entry needs its password hashed */
  649.     rewind(fp);
  650.     fptmp = tmpfile();
  651.     while(fgets(buf,BUFSIZ,fp) != NULLCHAR){
  652.         rip(buf);
  653.         if((len = strlen(buf)) == 0 || *buf == '#'
  654.          || (nlen = strcspn(buf,Whitespace)) == len){
  655.             /* Line is blank, a comment or unparseable;
  656.              * copy unchanged
  657.              */
  658.             fputs(buf,fptmp);
  659.             fputc('\n',fptmp);
  660.             continue;
  661.         }
  662.         /* Skip whitespace between name and pass */
  663.         for(pass=&buf[nlen];isspace(*pass);pass++)
  664.             ;
  665.  
  666.         if(*pass == '\0' || *pass == '*'
  667.          || (plen = strcspn(pass,Whitespace)) == strlen(pass)
  668.          || readhex(hexbuf,pass,sizeof(hexbuf)) == sizeof(hexbuf)){
  669.             /* Other fields are missing, no password is required,
  670.              * or password is already hashed; copy unchanged
  671.              */
  672.             fputs(buf,fptmp);
  673.             fputc('\n',fptmp);
  674.             continue;
  675.         }
  676.         MD5Init(&md);
  677.         MD5Update(&md,buf,nlen);    /* Hash name */
  678.         MD5Update(&md,pass,plen);    /* Hash password */
  679.         MD5Final(&md);
  680.         fwrite(buf,1,nlen,fptmp);    /* Write name */
  681.         fputc(' ',fptmp);        /* and space */
  682.         for(i=0;i<16;i++)    /* Write hashed password */
  683.             fprintf(fptmp,"%02x",md.digest[i] & 0xff);
  684.         fputs(&pass[plen],fptmp);    /* Write remainder of line */
  685.         fputc('\n',fptmp);
  686.     }
  687.     /* Now copy the temp file back into the userfile */
  688.     fclose(fp);
  689.     rewind(fptmp);
  690.     if((fp = fopen(Userfile,WRITE_TEXT)) == NULLFILE){
  691.         printf("Can't rewrite %s\n",Userfile);
  692.         free(buf);
  693.         return;
  694.     }
  695.     while(fgets(buf,BUFSIZ,fptmp) != NULLCHAR)
  696.         fputs(buf,fp);
  697.     fclose(fp);
  698.     fclose(fptmp);
  699.     free(buf);
  700. }
  701.  
  702. static char *Files[] = {
  703.     "Startup", "Userfile", "Hostfile", "Maillog", "Mailspool", "Mailqdir",
  704.     "Mailqueue", "Routeqdir", "Alias", "Group", "Dfile", "Fdir", "Fdbase",
  705.     "Quotes", "Tutor", "Info", "News", "Spool", "Arealist", "AreaSlist",
  706.     "Rewritefile", "Signature", "Historyfile", "Helpdir", "UDefaults",
  707.     "UDefbak", "Popusers", "Newsdir", "Forwardfile", "Netromfile",
  708.     "Onexit", "Expirefile", "FTPHelp", "Ftpmotd", "EditorHelp",
  709.     "MOTDfile", "MOTDsysfile", "NEWUSERfile", "WhitePagesBBS",
  710.     "WhitePages", "ConfInfo", "ConfHlp", "NetControlHlp", "Active",
  711.     "Pointer", "NInfo", "Nhelp", "History", "Forward", "Poll",
  712.     "MBOXHelp", "CommandHelp", "GPSfile", "ANSIArea", "ANSILogin",
  713.     "SMILEYFile", "ConfNews", "VersionFile", NULLCHAR
  714. };
  715.  
  716.  
  717. void setname(name, file)
  718. char *name, *file;
  719. {
  720. char **this = NULLCHARP;
  721. int k;
  722.  
  723.     for (k = 0; Files[k] != NULLCHAR; k++)    {
  724.         if (!stricmp (Files[k], name))
  725.             break;
  726.     }
  727.     if (Files[k] == NULLCHAR)
  728.         return;
  729.     switch (k)    {
  730.         case 0:        this = &Startup;    break;
  731.         case 1:        this = &Userfile;    break;
  732.         case 2:        this = &Hostfile;    break;
  733.         case 3:        this = &Maillog;    break;
  734.         case 4:        this = &Mailspool;    break;
  735.         case 5:        this = &Mailqdir;    break;
  736.         case 6:        this = &Mailqueue;    break;
  737.         case 7:        this = &Routeqdir;    break;
  738.         case 8:        this = &Alias;        break;
  739.         case 9:        this = &Group;        break;
  740.         case 10:    this = &Dfile;        break;
  741.         case 11:    this = &Fdir;        break;
  742.         case 12:    this = &Fdbase;        break;
  743.         case 13:    this = &Quotes;        break;
  744. #ifdef TUTOR
  745.         case 14:    this = &Tutor;        break;
  746.         case 15:    this = &Info;        break;
  747.         case 16:    this = &News;        break;
  748. #endif
  749.         case 17:    this = &Spool;        break;
  750.         case 18:    this = &Arealist;    break;
  751.         case 19:    this = &AreaSlist;    break;
  752.         case 20:    this = &Rewritefile;    break;
  753. #ifdef MAILBOX
  754.         case 21:    this = &Signature;    break;
  755.         case 22:    this = &Historyfile;    break;
  756.         case 23:    this = &Helpdir;    break;
  757. #ifdef USERLOG
  758.         case 24:    this = &UDefaults;    break;
  759.         case 25:    this = &UDefbak;    break;
  760. #endif
  761. #endif
  762. #if (defined(POP) || defined(POP2CLIENT) || defined(POP2SERVER) || defined(POP3CLIENT) || defined(POP3SERVER))
  763.         case 26:    this = &Popusers;    break;
  764. #endif
  765. #if (defined(NNTP) || defined(NNTPS))
  766.         case 27:    this = &Newsdir;    break;
  767. #endif
  768. #ifdef MBFWD
  769.         case 28:    this = &Forwardfile;    break;
  770. #endif
  771. #ifdef NETROM
  772.         case 29:    this = &Netromfile;    break;
  773. #endif
  774.         case 30:    this = &Onexit;        break;
  775. #ifdef EXPIRY
  776.         case 31:    this = &Expirefile;    break;
  777. #endif
  778.         case 32:    this = &FTPHelp;    break;
  779.         case 33:    this = &Ftpmotd;    break;
  780.         case 34:    this = &EditorHelp;    break;
  781.         case 35:    this = &MOTDfile;    break;
  782.         case 36:    this = &MOTDsysfile;    break;
  783.         case 37:    this = &NEWUSERfile;    break;
  784.         case 38:    this = &WhitePagesBBS;    break;
  785.         case 39:    this = &WhitePages;    break;
  786. #ifdef  CONVERS
  787.         case 40:    this = &ConfInfo;    break;
  788.         case 41:    this = &ConfHlp;    break;
  789.         case 42:    this = &NetControlHlp;    break;
  790. #endif
  791. #ifdef NNTPS
  792.         case 43:    this = &Active;        break;
  793.         case 44:    this = &Pointer;    break;
  794.         case 45:    this = &NInfo;        break;
  795.         case 46:    this = &Nhelp;        break;
  796.         case 47:    this = &History;    break;
  797.         case 48:    this = &Forward;    break;
  798.         case 49:    this = &Poll;        break;
  799. #endif
  800.         case 50:    this = &MBOXHelp;    break;
  801.         case 51:    this = &CommandHelp;    break;
  802. #ifdef GPS
  803.         case 52:    this = &GPSfile;    break;
  804. #endif
  805.         case 53:    this = &ANSIArea;    break;
  806.         case 54:    this = &ANSILogin;    break;
  807.         case 55:    this = &SMILEYFile;    break;
  808.         case 56:    this = &ConfNews;    break;
  809.         case 57:    this = &VersionFile;    break;
  810.     }
  811.     if (this != NULLCHARP)    {
  812.         if(Initroot)
  813.             free (*this);
  814.         *this = strdup(file);
  815.     }
  816. }
  817.  
  818. extern char *skipwhite __ARGS((char *));
  819.  
  820.  
  821. void
  822. assign_filenames(config, verbose)
  823. char *config;
  824. int verbose;
  825. {
  826.     FILE *fp;
  827.     char *name,*file,*cp;
  828.     int line;
  829. #define BUFLEN 128
  830.     char buf[BUFLEN+1];
  831.  
  832.     undosify(config);
  833.     if((fp = fopen(config,"r")) == NULL) {
  834.     if (verbose)    {
  835.             sprintf(buf, "Cannot open '%s'\n",config);
  836.             firstMsg = strdup (buf);
  837.         }
  838.         return;
  839.     }
  840.  
  841.     line = 0;
  842.     while(fgets(buf,BUFLEN,fp) != NULL) {
  843.         line++;
  844.         if(*buf == '#')         /* comment */
  845.             continue;
  846.         rip(buf);   /* delete ending \n */
  847.         name = skipwhite (buf);
  848.         if(*name == '\0')      /* blank line */
  849.             continue;
  850.         /* Search for filename */
  851.         if((file = strchr(name,'=')) == NULL) {
  852.             printf("Need '=', line %d of %s.\n",line,config);
  853.             continue;
  854.         }
  855.         *file++ = '\0';
  856.         /* cut trailing spaces */
  857.         if((cp = strchr(name,' ')) != NULL)
  858.             *cp = '\0';
  859.  
  860.         /* find start of filename */
  861.         file = skipwhite (file);
  862.  
  863.         if(*file == '\0')
  864.             continue;
  865.  
  866.         /* cut trailing spaces */
  867.         if((cp = strchr(file,' ')) != NULL)
  868.             *cp = '\0';
  869.  
  870.         /* Now parse the name, and assign if valid */
  871.         setname(name,file);
  872.     }
  873.     fclose(fp);
  874.     Assigned = 1;
  875. }
  876.  
  877.  
  878.